package interfazGrafica;

import java.io.Serializable;

import mundo.Control;

import processing.video.*;
import processing.core.PApplet;
import processing.core.PFont;
import processing.core.PVector;
import jp.nyatla.nyar4psg.*;

public class InterfazPrincipal extends PApplet implements Serializable{

	private static final long serialVersionUID = 1L;
	//Constantes que utiliza la librera ARToolKit para buscar los marcadores necesarios
	private static final String PARA = "/Users/marthagarzon/Desktop/Juan Manuel/Workspace/ModuloSimulacion/data/camera_para.dat";
	private static final String HIRO_PNG = "/Users/marthagarzon/Desktop/Juan Manuel/Workspace/ModuloSimulacion/data/hiro.png";

	private Capture cam;

	private MultiMarker nya;
	private PFont font=createFont("FFScala", 32);

	private ParticleSystem ps;
	private int reloj;
	private int resistenciaAlAgua;
	private int litrosPorMinuto;
	private boolean hayFlujo;
	private boolean hayPermiso;
	private Control mainControl;
	private int angulo;

	public void setup() {

		size(640, 480,P3D);
		smooth();

		reloj=0;
		hayFlujo=true;
		hayPermiso=false;
		resistenciaAlAgua=1;
		litrosPorMinuto=0;
		angulo=0;
		mainControl=new Control(this);

		cam = new Capture(this, width, height);
		ps = new ParticleSystem(new PVector(width/2,10),this);

		nya=new MultiMarker(this,width,height,PARA,new NyAR4PsgConfig(NyAR4PsgConfig.CS_RIGHT_HAND,NyAR4PsgConfig.TM_NYARTK));
		nya.setARClipping(100,1000);
		nya.setConfidenceThreshold(0.6);
		nya.addARMarker(loadImage(HIRO_PNG),16,25,80);
		nya.addNyIdMarker(31,80);
	}

	public void draw() {
		if (cam.available()) 
		{
			background(255);
			cam.read();
			nya.drawBackground(cam);
			nya.detect(cam);
			if(nya.isExistMarker(0)){
				nya.beginTransform(0);
				{

					draw3DModel(255,255,255);
				}
				nya.endTransform();  

				PVector p=nya.marker2ScreenCoordSystem(0,0,0,0);
				p=nya.screen2MarkerCoordSystem(0, 0, 0);
				PVector xUnitario= new PVector(1, 0, 0);
				angulo = (int) (PVector.angleBetween(p, xUnitario)*180/Math.PI);
				fill(255,255,255);
				rect(0, 0, 60, 60);
				fill(0,0,0);
				textFont(font,(float) 20.0);
				text(""+angulo,10,35);		
				noFill();
			}
			setResistenciaAlAgua((angulo/10));
			if(reloj>=resistenciaAlAgua&&hayFlujo&&hayPermiso){
				reloj=0;
				ps.addParticle();
				ps.addParticle();
				ps.addParticle();
			}
			reloj++;

			fill(255,255,255);
			rect(width-110,0, 110, 60);
			fill(0,0,0);
			textFont(font,(float) 20.0);
			litrosPorMinuto =resistenciaAlAgua>14?0:Math.abs(15-resistenciaAlAgua);
			text(litrosPorMinuto+" Lts/min",width-100,35);		
			noFill();

			ps.run();
		}
	}

	public void draw3DModel(int ir,int ig,int ib)
	{
		pushMatrix();
		drawgrid();
		fill(ir,ig,ib);
		stroke(0,0,0);
		translate(0,0,20);
		sphere(40);
		noFill();
		translate(0,0,-20);
		popMatrix();
	}

	public void drawgrid()
	{
		pushMatrix();
		stroke(0);
		strokeWeight(2);
		line(0,0,0,100,0,0);
		textFont(font,(float) 20.0); text("X",100,0,0);
		line(0,0,0,0,100,0);
		textFont(font,(float) 20.0); text("Y",0,100,0);
		popMatrix();
	}

	public void setResistenciaAlAgua(int resistenciaNueva) {
		if(resistenciaNueva>14)hayFlujo=false;
		else hayFlujo=true;
		if(resistenciaAlAgua!=resistenciaNueva&&hayPermiso)
		{
			mainControl.informarCambio(litrosPorMinuto);
		}
		resistenciaAlAgua = resistenciaNueva;
	}

	public void setHayPermiso(boolean permiso) {
		hayPermiso = permiso;
	}
}